module div_3(

input clk_i,
input rst_n_i,
output div3_o_r

    );
    
reg [1:0] pos_cnt;
reg [1:0] neg_cnt;
always@(posedge clk_i)begin                       //时钟上升沿进行
	if(!rst_n_i)                                  //复位低电平时
		pos_cnt <= 2'b00;                         //pos_cnt赋值为0
	else if(pos_cnt == 2'd2)                      //复位高电平，且pos_cnt为2时
		pos_cnt <= 2'b00;                         //pos_cnt重新赋值为0
	else
		pos_cnt <= pos_cnt + 1'b1;                //复位高电平，且pos_cnt小于2时，实现pos_cnt+1操作
end

always@(negedge clk_i)begin
	if(!rst_n_i)	
		neg_cnt <= 2'b00;
	else if(neg_cnt == 2'd2)
		neg_cnt <= 2'b00;
	else
		neg_cnt <= neg_cnt + 1'b1;
end                                                //逻辑同pos_cnt，时钟下降沿触发

reg div3_o_r0;
reg div3_o_r1;
always@(posedge clk_i)begin                         
	if(!rst_n_i)
		div3_o_r0 <= 1'b0;                       
	else if(pos_cnt < 2'd1)
		div3_o_r0 <= 1'b1;
	else
		div3_o_r0 <= 1'b0;
end                                  //pos_cnt == 2'd0的时候div3_o_r0输出高电平

always@(negedge clk_i)begin
	if(!rst_n_i)
		div3_o_r1 <= 1'b0;
	else if(neg_cnt < 2'd1)	
		div3_o_r1 <= 1'b1;
	else
		div3_o_r1 <= 1'b0;
end                                  //neg_cnt == 2'd0的时候div3_o_r1输出高电平
assign div3_o_r= div3_o_r0 | div3_o_r1;   
//在div3_o_r0与div3_o_r1相位相差180°条件下，两个1周期高电平相或即得1.5倍，即3倍周期
endmodule
